// ts的泛型
let arr10:Array<string>=["贾乃亮","王宝强","王思聪"];

//
// 指在定义函数、接口或类的时候，
// 不预先指定具体的类型，
// 而在使用的时候再指定具体类型的一种特性
// 泛型的形参设置T

function PlayGame<T>(game:T):T{
     console.log(game)
      return game as T
}
// <string>就是给T 传递的实参
PlayGame<string>("王者荣耀")
PlayGame<number>(1111)
 
function runDom<T,U>(a:T,b:U):T|U{
  let cc:T;
  console.log(a)
  console.log(b)
  return a
}
runDom<string,number>("sdf",23)
runDom<boolean,number>(true,23)
// 泛型对接口使用
interface Isport<T,U,K>{
  name:T,
  hours:U,
  run(a:U):K
}
let mysport:Isport<string,number,boolean>={
    name:"篮球",
    hours:198,
    run(a:number):boolean{
      return false
    }
}
let sport2:Isport<boolean,Array<number>,number>={
    name:true,
    hours:[1,2,3],
    run(a:Array<number>):number{
      return 1
    }
}
// 类中使用泛型
class Student<T,U,K>{
   name:T 
   age:U 
   sex:K 
   constructor(name:T,age:U,sex:K){
     this.name=name;
     this.age=age;
     this.sex=sex;
   }
   run(a:U):K{
     return 
   }
}
var xiaowang=new Student<string,number,boolean>("小王",12,true)
var xiaoli=new Student<boolean,string,object>(true,"123",{name:1})

// TS声明 html标签
// 单个元素 标注HTMLElement
var mydiv:HTMLElement=document.getElementById("div");
// 获取多个元素 标注NodeList
var lis:NodeList=document.querySelectorAll("li");
var btn:HTMLElement=document.getElementById("mybtn")